package com.sxj.corejava.code11_io.字节流;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 石小俊
 * @date 2024年05月18日 10:21
 */
public class Test05_对象输入输出流 {

    public static void main(String[] args) {
        test01();
        test02();
    }

    /**
     * 序列化:将对象转换成二进制流,可以通过一个文件来保存序列化后的二进制流
     */
    public static void test01() {
        ObjectOutputStream oos = null;
        User user = new User(1, "admin", "123456");
        User user2 = new User(2, "alice", "111111");
        User user3 = new User(3, "jack", "222222");
        List<User> users = new ArrayList<>();
        users.add(user);
        users.add(user2);
        users.add(user3);

        try {
            // 创建对象输出流,此时的参数是一个OutputStream
            // 因此,先定义一个OutputStream
            // 定义时可以指定一个文件,用于接收二进制流,文件格式无所谓,反正打开看不懂
            OutputStream out = new FileOutputStream("user.data");
            oos = new ObjectOutputStream(out);

            // 写入数据,支持任意格式的数据
//            oos.writeObject(1);
//            oos.writeObject(true);
//            oos.writeObject("admin");
//            oos.writeObject(user);
//            oos.writeObject(user2);
//            oos.writeObject(user3);
//            oos.writeObject(users);

            List list = new ArrayList();
            list.add(1);
            list.add(true);
            list.add("admin");
            list.add(user);
            list.add(user2);
            list.add(user3);
            list.add(users);
            oos.writeObject(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void test02() {
        try {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream("user.data"));

            // 由于写入的数据可以是任意类型
            // 因此读取时通过Object接收
//            Object obj = in.readObject();
//            System.out.println(obj);
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());

            List list = (List) in.readObject();
            for (Object obj : list) {
                System.out.println(obj);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}
